7F016064:	4AB94	menu 0B ??? - copies stage and difficulty
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
LUI	A0,8003
JAL	70006950	;stage#->800242FC: loaded stage
LW	A0,A8F4 (A0)	;A0=8002A8F4: stage#
LUI	A0,8003
JAL	7F0BFC1C	;A0->80048384: difficulty
LW	A0,A8FC (A0)	;A0=8002A8FC: selected difficulty
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP

then calls the 'interface', which only sets return menu

70006884:	this was the branch followed by complex, 2pl.
	it isn't really that pertinent right now...

//7F003CB8:	387E8
SLTI	AT,S5,003B
BEQ	AT,R0,7F004E10	;branch if 'stage#' > 0x3B
SLL	T7,S5,0x2	;T7=stage#->offset
LUI	T8,8003
ADDIU	T8,T8,74E4	;T8=800374E4: p->setup pointers for each stage
ADDU	S0,T7,T8	;S0=p->stage T7's setup pointer
LW	V0,0000 (S0)	;V0=p->setup filename
LUI	T9,8005
ADDIU	S1,SP,0174	;S1=p->final string
BEQ	V0,R0,7F004E10	;branch if no setup file
ADDIU	T9,T9,EDB0	;T9=8004EDB0: 0x100 of zeroes
OR	T2,S1,R0	;T2=S1: p->final string
ADDIU	T1,T9,00FC	;T1=T9+FC: endpoint
//7F003CEC:	3881C	prepare buffer for string: copy buffer to target
LW	AT,0000 (T9)
ADDIU	T9,T9,000C
ADDIU	T2,T2,000C
SW	AT,FFF4 (T2)
LW	AT,FFF8 (T9)
SW	AT,FFF8 (T2)
LW	AT,FFFC (T9)
BNE	T9,T1,7F003CEC
SW	AT,FFFC (T2)
//7F003D10:	38840	copy last entry and write first byte to buffer
LW	AT,0000 (T9)
OR	S4,R0,R0
OR	S3,R0,R0
SW	AT,0000 (T2)	;0x100 of zeroes in final string buffer
LBU	T3,0000 (V0)	;T3=first byte of filename
SB	R0,0175 (SP)	;write NULL after first byte
//7F003D28:	38858	test if MP or solo
JAL	7F09A464	;ret V0=#players
SB	T3,0174 (SP)	;1st byte->buffer
SLTI	AT,V0,0002
BNEZ	AT,7F003D48	;branch if solo
//7F003D38:	38868	loads "mp_" string for string extension
LUI	A1,8005
ADDIU	A1,A1,EEB0	;A1=8004EEB0: "mp_"
JAL	7000A7FC	;append string A1 to A0
OR	A0,S1,R0	;A0=S1: p->string on stack
//7F003D48:	append setup name
LW	A1,0000 (S0)	;A1=p->solo setup name for stage
OR	A0,S1,R0	;A0=S1: p->string on stack
JAL	7000A7FC
ADDIU	A1,A1,0001	;A1++ skip the 'U'
//7F003D58:
OR	A0,S1,R0	;A0=S1: setup name
ADDIU	A1,R0,0001	;A1=1: ???
ADDIU	A2,R0,0100	;A2=0100: ???
JAL	7F0BCD04	;load setup file into memory and stuff
ADDIU	A3,R0,0004	;A3=4: ??? - argument A3 to 7F0BCE0C - one byte
//7F003D6C
LUI	V1,8007
ADDIU	V1,V1,5D28
SW	V0,0000 (V1)	;V0->80075D28: p->setup file in memory

+_+

7F0BCD04:	load resource using string value
	accepts: A0=p->name, A1=?, A2=?, A3=?
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
SW	A1,001C (SP)
SW	A2,0020 (SP)
JAL	7F0BD254	;ret V0=ID# for resource A0
SW	A3,0024 (SP)
OR	A0,V0,R0	;A0=V0: ID#
LW	A1,001C (SP)
LW	A2,0020 (SP)
JAL	7F0BCE0C	;load ID# A0, A1=?, A2=?, A3=?
LBU	A3,0027 (SP)
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP


=_=

first off, getting rid of that buffer.  just SW R0 from now on.
secondly, omit the mp_ extension altogether.
	solo: strcpy
	mulit: use ID
could be cheap and throw both using ID...  That would halve the stage setup table and cause even more terrible errors in the editor ;*)

REVISION
//7F003CB8:	387E8
	SLTI	AT,S5,003B
	BEQ	AT,R0,7F004E10	;branch if 'stage#' > 0x3B
	*SLL	T7,S5,0x1	;T7=stage#->offset
	*LUI	A1,8003
	*ADDIU	T8,A1,74E4	;S0=800374E4: p->setup pointers for each stage
	ADDU	S0,T7,T8	;S0=p->stage T7's setup pointer
	*LHU	A0,0000 (S0)	;V0=p->setup filename
	*BEQ	A0,R0,7F004E10	;branch if no setup file
	-OR	S4,R0,R0
//7F003CDC:	3880C	
	*NOP
	*NOP
	*NOP
	*NOP
//7F003CEC:	3881C	
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
//7F003D10:	38840	copy last entry and write first byte to buffer
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
	*NOP
//7F003D38:	38868	test if MP or solo
	JAL	7F09A464	;ret V0=#players
	*LH	A2,A1,B536	;T8=8002B534: selected MP stage
	SLTI	AT,V0,0002
	*BNEZ	AT,7F003D58	;branch if solo
//7F003D48:	recover multiplayer setup ID#
	*SLL	A2,A2,0x3	;T8*8->offset
	*ADDU	A1,A1,A2
	*LHU	A0,B078 (A1)	;A0=8002B074+4+offset: setup ID
	*BEQ	A0,R0,7F004E10	;branch if no setup file
//7F003D58:	load ID# A0 into memory
	+OR	S3,R0,R0
	ADDIU	A1,R0,0001	;A1=1: ???
	ADDIU	A2,R0,0100	;A2=0100: ???
	*JAL	7F0BCE0C	;load setup file into memory and stuff
	ADDIU	A3,R0,0004	;A3=4: ??? - argument A3 to 7F0BCE0C - one byte
//7F003D6C
	LUI	V1,8007
	ADDIU	V1,V1,5D28
	SW	V0,0000 (V1)	;V0->80075D28: p->setup file in memory
	

+_+

okay, also have to do a few other things to make that work.
firstly, the selected MP stage [8002B534] needs to be split in half
	that way, you can select random and know what setup matches the stage

7F0106F8:	LW	->	LH	84-	*
7F010724:	SW	->	SH	A4-	*
7F0107D0:	LW	->	LH	84-	*
7F0107E0:	SW	->	SH	A4-	*
7F010D5C:	LW	->	LH	87-	*
7F011920:	LW	->	LH	85-	*
7F013F70:	SW	->	SH	A4-	*

7F0C0414:	LW	->	LH	85-	*	ramrom
7F0C0560:	SW	->	SH	A4-	*

oh, and hack the random stage selector as well...
//7F010D5C:	start MP game!
*LH	T8,B534 (T8)	;T8=8002B534: MP stage selected
LUI	V0,8003
LUI	AT,8003
SLL	T9,T8,0x2
SUBU	T9,T9,T8
SLL	T9,T9,0x3	;T9=MPstage * 0x18: offset to stage entry
ADDU	V0,V0,T9
LW	V0,B07C (V0)	;V0=8002B07C+offset: stage#
BGEZ	V0,7F010DD0	;branch if not random
NOP
//7F010D84:	handle random stage select
JAL	7000A450	;V0=random#
NOP
ADDIU	AT,R0,000B	;AT=# stage entries
DIVU	V0,AT
MFHI	V1		;V1=rand % #entries: MP stage entry in that range
SLL	T0,V1,0x2
SUBU	T0,T0,V1
SLL	T0,T0,0x3	;T0=MPstage * 0x18
LUI	T1,8003
ADDU	T1,T1,T0
LW	T1,B094 (T1)	;T1=8002B094+offset: stage#
LUI	AT,8003
ADDIU	A0,V1,0001	;A0=MPstage#+1: MPstage from 1-B (no rand)
JAL	7F0100D0
SW	T1,A8F4 (AT)	;stage#->8002A8F4: stage selected
BEQ	V0,R0,7F010D84	;branch if stage# still = 0
NOP
BEQ	R0,R0,7F010DD8
ADDIU	T2,R0,FFFF

